﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chapter23.Examples
{
    public class Code18
    {
        public static void BeginEx15()
        {
            var customers = new List<Customer> 
            { 
                new Customer { ID = "A", City = "New York", Country = "USA", Region = "North America", Sales = 9999 }, 
                new Customer { ID = "B", City = "Mumbai", Country = "India", Region = "Asia", Sales = 8888 }, 
                new Customer { ID = "C", City = "Karachi", Country = "Pakistan", Region = "Asia", Sales = 7777 }, 
                new Customer { ID = "D", City = "Delhi", Country = "India", Region = "Asia", Sales = 6666 }, 
                new Customer { ID = "E", City = "Sao Paulo", Country = "Brazil", Region = "South America", Sales = 5555 }, 
                new Customer { ID = "F", City = "Moscow", Country = "Russia", Region = "Europe", Sales = 4444 }, 
                new Customer { ID = "G", City = "Seoul", Country = "Korea", Region = "Asia", Sales = 3333 }, 
                new Customer { ID = "H", City = "Istanbul", Country = "Turkey", Region = "Asia", Sales = 2222 }, 
                new Customer { ID = "I", City = "Shanghai", Country = "China", Region = "Asia", Sales = 1111 }, 
                new Customer { ID = "J", City = "Lagos", Country = "Nigeria", Region = "Africa", Sales = 1000 }, 
                new Customer { ID = "K", City = "Mexico City", Country = "Mexico", Region = "North America", Sales = 2000 }, 
                new Customer { ID = "L", City = "Jakarta", Country = "Indonesia", Region = "Asia", Sales = 3000 }, 
                new Customer { ID = "M", City = "Tokyo", Country = "Japan", Region = "Asia", Sales = 4000 }, 
                new Customer { ID = "N", City = "Los Angeles", Country = "USA", Region = "North America", Sales = 5000 }, 
                new Customer { ID = "O", City = "Cairo", Country = "Egpyt", Region = "Africa", Sales = 6000 }, 
                new Customer { ID = "P", City = "Tehran", Country = "Iran", Region = "Asia", Sales = 7000 }, 
                new Customer { ID = "Q", City = "London", Country = "UK", Region = "Europe", Sales = 8000 }, 
                new Customer { ID = "R", City = "Baijing", Country = "China", Region = "Asia", Sales = 9000 }, 
                new Customer { ID = "S", City = "Bogotu", Country = "Colombia", Region = "South America", Sales = 1001 }, 
                new Customer { ID = "T", City = "Lima", Country = "Peru", Region = "South America", Sales = 2002 }, 
            };
            var orders = new List<Order>()
            {
                new Order { ID="P", Amout=100},
                new Order { ID="Q", Amout=200},
                new Order { ID="R", Amout=300},
                new Order { ID="S", Amout=400},
                new Order { ID="T", Amout=500},
                new Order { ID="U", Amout=600},
                new Order { ID="V", Amout=700},
                new Order { ID="W", Amout=800},
                new Order { ID="X", Amout=900},
                new Order { ID="Y", Amout=1000},
                new Order { ID="Z", Amout=110},
            };
            var customerIDs =
                from c in customers
                select c.ID;
            var ordersIDs =
                from o in orders
                select o.ID;
            var customersWithOrders = customerIDs.Intersect(ordersIDs);
            Console.WriteLine("Customers IDs with Orders:");
            foreach (var item in customersWithOrders)
            {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();
            Console.WriteLine("Order IDs with no customers:");
            var ordersNoCustomers = ordersIDs.Except(customerIDs);
            foreach (var item in ordersNoCustomers)
            {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();
            Console.WriteLine("All Customer and Order IDs:");
            var allCustomerOrderIDs = ordersIDs.Union(customerIDs);
            foreach (var item in allCustomerOrderIDs)
            {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();
            Console.WriteLine("Program finished, press Enter Return to continue:");
            Console.ReadLine();
        }

        private class Customer
        {
            public string ID { get; set; }
            public string City { get; set; }
            public string Country { get; set; }
            public string Region { get; set; }
            public decimal Sales { get; set; }

            public override string ToString()
            {
                return "ID: " + ID + " City: " + City + " Conutry: " + Country + " Region: " + Region + " Sales: " + Sales;
            }
        }

        private class Order
        {
            public string ID { get; set; }

            public decimal Amout { get; set; }
        }
    }
}
